// 用接口interface定义对象

interface list {
  id: number;
  name: string;
}

interface Result {
  data: list[];
}

function render(result: Result) {
  result.data.forEach((value) => {
    console.log(value.id, value.name);
  });
}

let result = {
  data: [
    {id: 1, name: 'A', sex: 'male'},
    {id: 2, name: 'B',}
  ]
}

render(result);

// 用数字索引的接口
interface StringArray {
  [index: number]: string; // 这样的含义就是：用任意的数字去索引`StringArray`都会得到一个string，这就相当于声明了一个字符串类型的数组
}

let chars: StringArray = ['A', 'B', 'C'];

// 用字符串去索引一个接口
interface Names {
  [x: string]: string, // 这个含义就是：用任意的字符串去索引`Names`得到的结果都是string，这样声明之后我们就不能声明一个number类型的成员了
  // y: number; // 类型“number”的属性“y”不能赋给“string”索引类型“string”，如果想这样做就需要把上一个的类型定义为 any `[x: string]: any`
}

// 混用数字索引和字符串索引【这样就是说我们既可以用数字去索引`Names1`也可以用字符串去索引`Names1`】
// 这里需要注意的是：数字索引签名的返回值一定要是字符串索引签名返回值的子类型，这是因为javascript会进行类型转换将 number 转换为 string 这样就能保持类型的兼容性
interface Names1 {
  [x: string]: string,
  // [z: number]: number, // 把返回值改成number那么这样就和string不兼容了
  [z: number]: string
}


